# Selectable.java

    package org.codefilarete.stalactite.query.model;

    /**
     * Contract for elements to be put in a Select clause to be transformed to SQL
     *
     * @see SimpleSelectable
     * @author Guillaume Mary
     */
    public interface Selectable<C> {

    	/**
    	 * Gives the SQL string that must be put in the select clause.
    	 * Expected to be a valid and security-proof expression: don't consider any validation will be done.
    	 *
    	 * @return any non-null SQL statement for a select clause
    	 */
    	String getExpression();

    	Class<C> getJavaType();

    	static Selectable<String> selectableString(String expression) {
    		return new SimpleSelectable<>(expression, String.class);
    	}

    	/**
    	 * Implementation for String to be put in Select clause or as a criteria.
    	 * Be aware that expression given at constructor will be rendered as it is to SQL without transformation.
    	 */
    	class SimpleSelectable<C> implements Selectable<C> {

    		private final String expression;

    		private final Class<C> javaType;

    		/**
    		 * Straight constructor.
    		 * Be aware that expression will be rendered as it is to SQL without transformation.
    		 *
    		 * @param expression the text to be put into SQL
    		 * @param javaType type returned by expression
    		 */
    		public SimpleSelectable(String expression, Class<C> javaType) {
    			this.expression = expression;
    			this.javaType = javaType;
    		}

    		@Override
    		public String getExpression() {
    			return expression;
    		}

    		@Override
    		public Class<C> getJavaType() {
    			return javaType;
    		}
    	}
    }